/**
 * @file geminai_para.h
 * @brief 参数保存到nvs
 * @author zl
 */

#ifndef __GEMINAI_PARA__
#define __GEMINAI_PARA__
#include <stdio.h>
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "nvs.h"
#include <stdlib.h>
#include <string.h>
#include "esp_mac.h"
#include "esp_log.h"
#include "geminai_log.h"


//命名空间(最多只能15个字符)
#define NS_FRIG_PARA   "ns_frig_para"
//键(最多只能15个字符)
#define KEY_FRIG_PARA  "keyFrigPara"
#define KEY_TIMER_WAKEUP_COUNT "keyTimeCnt"//定时器唤醒次数
#define KEY_SYSTEM_PARA "keySysPara"

typedef struct{
	int8_t  temp_des;//目标温度
	uint8_t temp_diff;//回差温度
	uint8_t delay_tim;//压缩机延时保护时间(单位:min)
	uint8_t compressor_start_delay;//压缩机延时启动时间
	uint8_t device_lock;//锁机标志位
	uint8_t forced_cooling;//强制制冷
	uint8_t defrost_time;//除霜时间
	uint8_t overtemp;//高温报警温度
	int8_t  lowtemp;//低温报警温度温度
	uint8_t overtemp_flag;//高温报警标志位
	uint8_t lowtemp_flag;//低温报警标志位
	uint8_t	overtemp_fans_protect_temp;//高温风机保护温度
	uint8_t defrost_shielding_time;//除霜屏蔽时间
	uint8_t overtemp_alarm_delay_time;//超温延时屏蔽时间
	uint8_t led_pwm;//灯光亮度
	int8_t temp_offset;//温度传感器偏移温度(-10~10)
	int8_t temp_des_min;//目标温度最小值(min:-50)
	int8_t  temp_des_max;//目标温度最大值(max:50)
	uint8_t eco_state_temp;//节能模式上调温度
	uint8_t sleep_state_temp;//休眠模式上调温度
	uint8_t comp_max_runtime;//压缩机最大运行时间(单位:min)(0:不限制)
	uint8_t comp_fault_runtime;//传感器故障运行时间(单位:min)
	uint8_t comp_fault_dowmtime;//传感器异常停机时间(单位:min)
	uint8_t forced_cold_time;//强制制冷时间(单位:hour)
	uint8_t defrost_time_type;//除霜计时方式(0:压缩机累计运行时间 1:控制器运行时间)
	uint8_t defrost_boot_shielding_time;//上电除霜屏蔽时间(单位:h)
	uint8_t defrost_show_type;//除霜显示方式(0:温度与df交替显示 1:显示除霜前的温度 2:显示df)
	uint8_t sound_output;//声音输出(0:不输出 1:输出)
	uint8_t door_open_type;//门开关方式方式(0:0: 取消门开关(上传门开关次数不受影响)1: 门打开时关闭风机，门关闭时开启风机2: 门打开时开灯，门关闭时关灯3: 门打开时关闭风机，开灯；门关闭时开启风机，关灯)
	uint8_t door_alarm_time;//开门报警时间(单位:min)
	uint8_t light_ctrl;//灯光控制(0:屏蔽控制 1:控制)
	uint8_t fan_run_type;//风机运行方式(0:随门开关启停 1:随压缩机启停 2:常转)  
	uint8_t defrost_fan_run_type;//除霜时风机运行方式(0:除霜时风机运行 1:除霜时风机停止)
	uint8_t door_open_fan_time;//关门风机启动时间(单位：s)
	uint8_t open_door_times_cancel_defrost;//取消上电除霜屏蔽时间的开门次数
	uint8_t frig_run_mode;//运行模式(0:正常模式 1:节能模式 2:休眠模式)
	uint16_t start_shielding_time;//上电屏蔽时间
	uint16_t defrost_cycle;//除霜周期
	uint16_t overtemp_fans_protect_time;//高温风机保护时间
}frig_ctl_para;


typedef struct{
	uint8_t org_temp_init;//刚上电获取初始化温度标识
	uint8_t sec_cnt;//秒钟计数器
	uint8_t min_cnt;//分钟计数器
	float orgin_temp;//刚上电的初始温度
	float real_temp;//实时温度
	float temp_per_min_t;//1min内温度均值累加器
	float temp_per_min;//1min内温度均值
	float temp_per_hour_t;//1h内温度均值累加器
	float temp_per_hour;//1h内温度均值
	float around_temp;//环境温度
}frig_temp; 

typedef struct{
	uint32_t t_compressor;//压缩机工作时间
	uint32_t t_vaporizerfan;//蒸发风机工作时间
	uint32_t t_logo;//logo灯工作时间
	uint32_t t_env_light;//氛围灯工作时间
	uint32_t c_compressorrelay;//压机继电器通断次数
	uint32_t c_vaporizerrelay;//蒸发风机继电器通断次数
}main_dev_monitor;//主要器件状态跟踪(器件工作时间及次数统计)


typedef struct{
	uint8_t fans_flag;
	uint8_t comp_flag;
	uint8_t fans_state;
	uint8_t comp_state;	
}relay_state;//继电器控制

typedef struct{
	int report_interval;//属性上报周期
	uint8_t volume;
}system_para_t;//系统参数

typedef struct base_station_s {
    char cid[12];   // 增加长度以适应 CID 的最大值
    char lac[12];   
    char mcc[12];   
    char mnc[12];  
    char net[12];   
    int ss;

    char imei[24];
    char imsi[32];
    char PhoneNum[32];
	char asset_id[48];
	char product_key[24];
	uint8_t wifi_mac[6];
	uint8_t bt_mac[6];
} base_station_t;

extern uint16_t alarm_stat;//报警标志位
extern uint16_t overtemp_time;//高温报警时间
extern uint8_t led_status;//灯状态 0-关闭 1-开启
extern uint8_t frig_sys_switch;//系统开关状态
extern frig_ctl_para temp_ctl_para;
extern frig_temp sys_temp;
extern main_dev_monitor devices_tim_cnt;
extern unsigned long attribute_send_event;//属性发送
extern base_station_t base_station;//4g信息
extern system_para_t system_para;//系统参数

#define TEMP_ERR_UPPER		(60)//温度传感器故障值上限
#define TEMP_ERR_LOWER		(-15)//温度传感器故障值下限

//初始化nvs
void initialize_NVS(void);
//初始化参数
void initialize_para(void);
//参数保存
void save_frig_para(void);
//设置默认参数
void set_default_para(void);
//定时器唤醒次数
int timer_wakeup_count_get(void);
void timer_wakeup_count_set(int count);

#endif